Prisma ORM
Prisma ORM is an open-source next-generation ORM. It consists of the following parts:
主に以下の 3 つの要素から構成されている
・Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript セットアップ
インストール
code:sh
$ npm install prisma --save-dev
初期セットアップ
code:sh
$ npx prisma init
実行すると、prisma/schema.prisma と .env が作成される
prisma/schema.prisma
code:prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
prisma generate 実行時にどのようなアセットが作成されるかを定義する
code:prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Prisma がどのようにデータベースに接続するかを定義する
code:.env
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
model ブロックを用いて Model を定義する
code:schema.prisma
model Task {
id Int @id @default(autoincrement())
name String @db.VarChar(255)
dueDate String @db.VarChar(10)
status Status @default(NOT_STARTED)
description String?
createdAt DateTime @default(now()) @db.Timestamp(0)
updateAt DateTime @updatedAt @db.Timestamp(0)
}
@db.VarChar: デフォルトだと text に変換されるので、varchar になるように明示する
@db.Timestamp: 秒まで表示するようにする
enum ブロックを用いると、Enum を定義することも可能 code:schema.prisma
enum Status {
NOT_STARTED
IN_PROGRESS
COMPLETED
}
マイグレーション
prisma migrate dev: ファイル生成 + 開発環境用のマイグレーションの実行
1. Reruns the existing migration history in the shadow database in order to detect schema drift (edited or deleted migration file, or a manual changes to the database schema)
2. Applies pending migrations to the shadow database (for example, new migrations created by colleagues)
3. Generates a new migration from any changes you made to the Prisma schema before running migrate dev
4. Applies all unapplied migrations to the development database and updates the _prisma_migrations table
5. Triggers the generation of artifacts (for example, Prisma Client)
code:sh
$ npx prisma migrate dev --name <ファイル名>
実行すると、prisma/migrations に SQL ファイルと、migration_lock.tomlが生成される code:sql
-- CreateEnum
CREATE TYPE "Status" AS ENUM ('NOT_STARTED', 'IN_PROGRESS', 'COMPLETED');
-- CreateTable
CREATE TABLE "Task" (
"id" SERIAL NOT NULL,
"name" VARCHAR(255) NOT NULL,
"dueDate" VARCHAR(10) NOT NULL,
"status" "Status" NOT NULL DEFAULT 'NOT_STARTED',
"description" TEXT,
"createdAt" TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(0) NOT NULL,
CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
);
code:migration_lock.toml
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
1対多のケース
code:schema.prisma
model Task {
...
userId Int
user User @relation(fields: userId, references: id, onDelete: Cascade) }
model User {
...
Task Task[]
}
モデルを取得するフィールドでは @relation を用いて関連データの情報を入力する
fields: 外部キーとなるフィールド名
references: fields が指す参照先モデルの ID
更新(onUpdate)・削除(onDelete)時のオプションを指定することも可能